package chances.declare.service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import chances.declare.entity.CPContent;
import chances.declare.entity.CPContentAndOplog;
import chances.declare.repo.CPContentRepository;
import chances.declare.util.DateUtil;
import chances.declare.web.CPcontentQueryModel;
import chances.system.operator.entity.EnumData;
import chances.system.operator.entity.Operator;

/**
* @Author WangCC
* @Date 2017年7月28日 下午5:05:37
* chances.declare.service
* @Version 1.0
*/

@Service
public class CPContentService {

    @Autowired
    private CPContentRepository repository;

    /**
     * 查询所有内容
     * @param queryModel 查询参数
     * @param pageable 分页
     * @return
     */
    /*
     * public Page<CPContent> findContentAll(CPcontentQueryModel
     * queryModel,Pageable pageable){ return
     * this.repository.findCPContentByOrgId(queryModel, pageable); }
     */
    public Page<CPContent> findContentAll(CPcontentQueryModel queryModel, Pageable pageable) {
        return this.repository.findCPContentByOrgId(queryModel, pageable);
    }

    /**
     * 添加和保存
     * @param cpContent
     */
    public void Save(CPContent cpContent) {
        this.repository.save(cpContent);
    }

    /**
     * 根据id查询一条信息
     * @param id
     * @return
     */
    public CPContent findOne(Long id) {
        return this.repository.findOne(id);
    }
    
    /**
     * 根据id查找多条内容
     * @param ids
     * @return
     */
    public List<CPContent> findList(List<Long> ids){
    	return this.repository.findAll(ids);
    }
    
    /**
     * 批量申报
     * @param ids
     * @param copyrightTime
     * @param planOnlineTime
     * @return 处理失败的错误列表
     */
    public List<String> batchDeclare(Operator user,List<Long> ids,String copyrightTime,String planOnlineTime){
    	List<CPContent> cpclist = this.repository.findAll(ids);
    	List<String> errorList = new ArrayList<String>();
    	for (CPContent cItem : cpclist) {
    		if(user.getOrgId().longValue() == cItem.getOrgId().longValue()){
	    		try{
	    			if(cItem.getStatus()==CPContent.STATUS_WAIT_DECLARE){
	    				cItem.setPlanOnlineTime(DateUtil.StringTranslatedDate(planOnlineTime));//预计上线时间
	    				cItem.setCopyrightTime(DateUtil.StringTranslatedDate(copyrightTime));//授权时间
	    				cItem.setStatus(CPContent.STATUS_WAIT_ONLINE);//状态变为待上线
	    				cItem.setIsAdopted(CPContent.ISADOPTED_AWAIT);//采纳状态变为待采纳
	    				cItem.setDeclareTime(new Date());
		    			this.repository.save(cItem);
	    			}else{
	    				errorList.add(cItem.getName()+"（状态不正确，应选择待申报状态内容）");
	    			}
	    		}catch(Exception e){
	    			errorList.add(cItem.getName()+"("+e.getMessage()+")");
	    			continue;
	    		}
    		}
		};
		return errorList;
    }

    /**
     * 批量上线和删除
     * @param ids
     * @param status 要改变的状态
     * @return 错误列表
     */
    public List<String> batchOnlineAndDelect(Operator user,List<Long> ids,Integer status){
    	List<CPContent> cpclist = this.repository.findAll(ids);
    	List<String> errorList = new ArrayList<String>();
    	boolean condition = false;
    	for (CPContent cItem : cpclist) {
    		if(user.getOrgId().longValue() == cItem.getOrgId().longValue()){
	    		try{
	    			//进行上线操作时
	    			if(status == CPContent.STATUS_ONLINE){
	    				//判断内容状态是否等于待上线
	    				if(cItem.getStatus()==CPContent.STATUS_WAIT_ONLINE){
	    					condition = true;
	    				}else{
	    					errorList.add(cItem.getName()+"（状态不正确，应选择待上线状态内容）");
	    					continue;
	    				}
	    	    	}
	    			//进行删除操作时
	    	    	if(status == CPContent.STATUS_DELETE){
	    	    		//判断内容采纳状态是否为为初始状态或者未采纳状态
	    	    		if(cItem.getIsAdopted()==CPContent.ISADOPTED_INIT || cItem.getIsAdopted()==CPContent.ISADOPTED_NOT){
	    	    			condition = true;
	    	    		}else{
	    					errorList.add(cItem.getName()+"（状态不正确，应选择待删除状态内容）");
	    					continue;
	    				}
	    	    	}
	    			if(condition){
	    				//状态为待上线状态时设置上线时间
	    				if(cItem.getStatus() == CPContent.STATUS_WAIT_ONLINE){
	    					cItem.setOnlineTime(new Date());
	    				}
	    				cItem.setStatus(status);//改变状态
		    			this.repository.save(cItem);
		    			condition = false;
	    			}
	    		}catch(Exception e){
	    			errorList.add(cItem.getName()+"（"+e.getMessage()+"）");
	    			continue;
	    		}
    		}
		};
		return errorList;
    }
    
    /**
     * 根据value查找ENUM
     * @param value
     * @return
     */
    public EnumData findEnumByValue(Long parentId, String value) {
        return this.repository.findByValue(parentId, value);
    }

    /**
     * 根据code查内容
     * @param code
     * @return
     */
    public List<CPContent> findByCode(String code, Long id) {
        if (id != null) {
            return this.repository.findByCodes(code, id);
        }
        return this.repository.findByCode(code);
    }

    /**
     * 根据externalCode查内容
     * @param externalCode
     * @return
     */
    public List<CPContent> findByExternalCode(String externalCode, Long id) {
        if (id != null) {
            return this.repository.findByExternalCodes(externalCode, id);
        }
        return this.repository.findByExternalCode(externalCode);
    }

    public Page<CPContentAndOplog> search(Long id, String name, String operateType, String orgName,
            String opName, String beginTime, String endTime, int page, int size) {
        return repository.search(id, name, operateType, orgName, opName, beginTime, endTime,
                new PageRequest(page, size));
    }
}
